package twoD;

/**
 * @author pengfei.hpf
 * @date 2020/3/25
 * @verdion 1.0.0
 * 892. 三维形体的表面积
 * 在 N * N 的网格上，我们放置一些 1 * 1 * 1  的立方体。
 *
 * 每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。
 *
 * 请你返回最终形体的表面积。
 *
 *
 *
 * 示例 1：
 *
 * 输入：[[2]]
 * 输出：10
 * 示例 2：
 *
 * 输入：[[1,2],[3,4]]
 * 输出：34
 * 示例 3：
 *
 * 输入：[[1,0],[0,2]]
 * 输出：16
 * 示例 4：
 *
 * 输入：[[1,1,1],[1,0,1],[1,1,1]]
 * 输出：32
 * 示例 5：
 *
 * 输入：[[2,2,2],[2,1,2],[2,2,2]]
 * 输出：46
 *
 *
 * 提示：
 *
 * 1 <= N <= 50
 * 0 <= grid[i][j] <= 50
 */
public class SurfaceArea {


    public int surfaceArea(int[][] grid) {

        if(grid == null || grid.length == 0 || grid[0].length == 0){
            return 0;
        }
        int n = grid.length;
        int[][] dir = new int[][]{{-1,0}, {0, -1}};
        int sum = 0;
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j ++){
                int area = 0;
                if(grid[i][j] > 0){
                    int side = grid[i][j] * 4;
                    area = side + 2;
                    for(int m = 0; m < dir.length; m ++){
                        int r = i + dir[m][0];
                        int c = j + dir[m][1];
                        if(r >=0 && c >= 0 && r < n && c < n){
                            int height = Math.min(grid[r][c], grid[i][j]);
                            //TODO: 二维截面 是两个都要减去的
                            area -= height*2;
                        }
                    }
                }
                sum += area;
            }
        }
        return sum;
    }
}


